# Amazon评论嵌入与语义搜索改进版
# 增加数据量，改进嵌入生成逻辑，优化可视化效果

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.metrics.pairwise import cosine_similarity
import re
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

def create_enhanced_sample_data():
    """创建增强的模拟Amazon评论数据集 - 更多样本，更明显的类别区分"""
    reviews_data = {
        '摘要': [
            # 电子产品类 (手机、电脑、耳机等)
            "手机电池续航优秀", "电脑运行速度快", "耳机音质清晰", "充电器充电快速", "屏幕显示清楚",
            "处理器性能强劲", "摄像头拍照效果好", "内存容量大", "WiFi连接稳定", "蓝牙连接方便",
            "手机发热严重", "电脑死机频繁", "耳机音质模糊", "充电器损坏", "屏幕有坏点",

            # 服装类
            "衣服质量很好", "面料舒适透气", "版型合身", "颜色鲜艳", "做工精细",
            "裤子尺码合适", "鞋子穿着舒适", "材质柔软", "款式时尚", "穿着效果好",
            "衣服容易起球", "面料粗糙", "尺码偏小", "颜色掉色", "线头很多",

            # 书籍类
            "书籍内容丰富", "知识点全面", "适合学习", "印刷质量好", "装帧精美",
            "内容深入浅出", "案例详细", "理论扎实", "实用性强", "值得收藏",
            "内容过时", "错误较多", "印刷模糊", "装订松散", "纸质差",

            # 食品类
            "食品味道不错", "新鲜度好", "包装严密", "营养丰富", "口感佳",
            "食材优质", "调味适中", "保质期长", "配送及时", "价格实惠",
            "食品变质", "味道奇怪", "包装破损", "过期产品", "质量堪忧",

            # 家居用品类
            "家具质量好", "外观设计漂亮", "实用性强", "材质环保", "组装简单",
            "收纳功能强", "颜色搭配好", "尺寸合适", "性价比高", "做工精良",
            "家具不稳", "设计丑陋", "材质有味", "组装困难", "容易损坏",

            # 服务类
            "客服态度好", "物流速度快", "包装精美", "售后服务佳", "配送准时",
            "服务专业", "响应及时", "问题解决快", "态度友好", "体验满意",
            "客服态度差", "物流慢", "包装粗糙", "售后推诿", "配送延误"
        ],
        '文本': [
            # 电子产品类 - 正面评价
            "这款手机的电池续航能力让我非常满意，一天重度使用完全没问题，充电速度也很快。",
            "这台电脑的运行速度非常快，开机只需要几秒钟，多任务处理毫无压力，性能很强。",
            "耳机的音质非常清晰，高音亮丽低音浑厚，听音乐看电影都有很好的体验。",
            "充电器的充电速度真的很快，半小时就能充到80%，而且发热控制得很好。",
            "屏幕显示效果很清楚，色彩鲜艳准确，分辨率高，看视频很享受。",
            "处理器的性能确实强劲，运行大型软件和游戏都很流畅，没有卡顿现象。",
            "摄像头的拍照效果超出预期，白天夜晚都能拍出清晰的照片，功能丰富。",
            "内存容量很大，存储了很多应用和文件都不会卡顿，运行速度保持流畅。",
            "WiFi连接非常稳定，信号强度好，网速快，上网体验很好。",
            "蓝牙连接很方便，配对速度快，连接稳定，音质传输无损。",

            # 电子产品类 - 负面评价
            "手机发热问题严重，使用一会就很烫，影响正常使用体验。",
            "电脑经常死机重启，系统不稳定，工作时很影响效率。",
            "耳机音质很模糊，听起来像隔了一层纱，音乐细节丢失严重。",
            "充电器用了没多久就坏了，质量不行，而且充电速度很慢。",
            "屏幕有明显坏点，影响视觉体验，质量控制有问题。",

            # 服装类 - 正面评价
            "衣服的质量非常好，面料手感舒适，做工精细，穿着很有质感。",
            "面料透气性很好，夏天穿也不会闷热，舒适度很高。",
            "版型设计很合身，穿着效果很好，显瘦又时尚。",
            "颜色非常鲜艳，和图片一致，色彩饱和度高，很好看。",
            "做工确实精细，每个细节都处理得很好，线头收得很干净。",
            "裤子的尺码很合适，长度刚好，腰围也合身，版型不错。",
            "鞋子穿着很舒适，鞋底软硬适中，走路不累脚。",
            "材质很柔软，贴身穿着很舒服，不会有粗糙感。",
            "款式很时尚，设计感强，穿出去回头率很高。",
            "穿着效果比预期好，显气质，很满意这次购买。",

            # 服装类 - 负面评价
            "衣服容易起球，洗了几次就不行了，质量有问题。",
            "面料摸起来很粗糙，穿着不舒服，材质感觉很廉价。",
            "尺码明显偏小，按照尺码表买的但是穿不下。",
            "颜色严重掉色，洗一次就褪色了，质量太差。",
            "衣服线头很多，做工粗糙，看起来就很便宜。",

            # 书籍类 - 正面评价
            "这本书的内容非常丰富，涵盖了很多知识点，学习价值很高。",
            "知识点讲解全面深入，从基础到进阶都有涉及，很系统。",
            "内容很适合学习，讲解清晰易懂，例子生动具体。",
            "印刷质量很好，纸张厚实，字迹清晰，阅读体验佳。",
            "装帧非常精美，封面设计好看，内页排版整齐。",
            "内容深入浅出，复杂的概念解释得很清楚，容易理解。",
            "书中的案例很详细，理论结合实践，学习效果好。",
            "理论基础很扎实，学术性强，适合深入研究。",
            "实用性很强，学了就能用，对工作帮助很大。",
            "这本书值得收藏，内容经典，可以反复阅读。",

            # 书籍类 - 负面评价
            "内容已经过时了，很多观点都落后了，参考价值不大。",
            "书中错误比较多，影响学习效果，编辑不够仔细。",
            "印刷很模糊，字体太小，阅读起来很吃力。",
            "装订松散，翻几页就掉页，质量太差。",
            "纸质很差，很薄很粗糙，感觉像盗版书。",

            # 食品类 - 正面评价
            "食品味道很不错，口感丰富，让人印象深刻。",
            "新鲜度保持得很好，没有异味，质量可靠。",
            "包装很严密，保护得很好，运输过程没有损坏。",
            "营养价值丰富，健康美味，老少皆宜。",
            "口感层次丰富，味道调配得当，很好吃。",
            "食材选用优质，能感受到用料的用心。",
            "调味适中不过咸不过淡，符合大众口味。",
            "保质期比较长，储存方便，可以囤货。",
            "配送很及时，食品保持新鲜状态送达。",
            "价格很实惠，性价比高，物超所值。",

            # 食品类 - 负面评价
            "食品已经变质了，有异味，不能食用。",
            "味道很奇怪，和描述不符，口感不好。",
            "包装破损严重，食品暴露在外，不卫生。",
            "收到的是过期产品，日期已经过了。",
            "质量让人担忧，看起来就不新鲜。",

            # 家居用品类 - 正面评价
            "家具质量很好，用料扎实，做工精良。",
            "外观设计很漂亮，现代简约风格，很有品味。",
            "实用性很强，功能设计合理，日常使用方便。",
            "材质很环保，没有异味，安全放心。",
            "组装过程很简单，说明书清楚，工具齐全。",
            "收纳功能很强大，空间利用率高，实用。",
            "颜色搭配很好看，和家里装修风格很匹配。",
            "尺寸大小刚好合适，不占地方，实用性强。",
            "性价比很高，质量好价格合理，值得购买。",
            "做工非常精良，细节处理到位，品质可靠。",

            # 家居用品类 - 负面评价
            "家具很不稳定，摇摇晃晃的，质量有问题。",
            "设计很丑陋，款式过时，放在家里很突兀。",
            "材质有刺鼻气味，可能不环保，令人担忧。",
            "组装非常困难，说明书不清楚，工具不全。",
            "家具很容易损坏，用了没多久就出问题。",

            # 服务类 - 正面评价
            "客服态度非常好，耐心解答问题，服务专业。",
            "物流速度很快，下单第二天就到了，效率很高。",
            "包装非常精美，保护得很好，体现了用心。",
            "售后服务很好，问题处理及时，让人满意。",
            "配送很准时，按照约定时间送达，值得信赖。",
            "服务很专业，工作人员素质高，体验好。",
            "响应速度很及时，有问题马上就有人处理。",
            "问题解决得很快，效率高，服务到位。",
            "态度很友好，让人感受到真诚的服务。",
            "整体体验很满意，服务质量值得称赞。",

            # 服务类 - 负面评价
            "客服态度很差，不耐烦，服务质量低。",
            "物流速度太慢，等了一个星期才到。",
            "包装很粗糙，东西都压坏了，保护不到位。",
            "售后服务推诿责任，不解决问题。",
            "配送总是延误，时间不准确，很不靠谱。"
        ],
        '评分': [
            # 电子产品正面
            4.8, 4.9, 4.7, 4.6, 4.8, 4.9, 4.7, 4.8, 4.6, 4.7,
            # 电子产品负面
            2.1, 2.3, 2.2, 2.0, 2.4,
            # 服装正面
            4.6, 4.7, 4.8, 4.5, 4.9, 4.6, 4.7, 4.8, 4.5, 4.6,
            # 服装负面
            2.2, 2.1, 2.3, 2.0, 2.2,
            # 书籍正面
            4.8, 4.9, 4.7, 4.6, 4.8, 4.7, 4.8, 4.9, 4.6, 4.7,
            # 书籍负面
            2.3, 2.1, 2.2, 2.0, 2.1,
            # 食品正面
            4.5, 4.6, 4.7, 4.8, 4.6, 4.7, 4.5, 4.6, 4.8, 4.7,
            # 食品负面
            1.8, 2.0, 1.9, 1.7, 2.1,
            # 家居正面
            4.7, 4.8, 4.6, 4.9, 4.5, 4.7, 4.8, 4.6, 4.7, 4.8,
            # 家居负面
            2.2, 2.0, 2.3, 2.1, 2.2,
            # 服务正面
            4.9, 4.8, 4.7, 4.8, 4.9, 4.8, 4.7, 4.8, 4.9, 4.8,
            # 服务负面
            1.9, 2.1, 2.0, 1.8, 2.0
        ],
        '类别': [
            # 电子产品
            "电子产品", "电子产品", "电子产品", "电子产品", "电子产品",
            "电子产品", "电子产品", "电子产品", "电子产品", "电子产品",
            "电子产品", "电子产品", "电子产品", "电子产品", "电子产品",
            # 服装
            "服装", "服装", "服装", "服装", "服装", "服装", "服装", "服装", "服装", "服装",
            "服装", "服装", "服装", "服装", "服装",
            # 书籍
            "书籍", "书籍", "书籍", "书籍", "书籍", "书籍", "书籍", "书籍", "书籍", "书籍",
            "书籍", "书籍", "书籍", "书籍", "书籍",
            # 食品
            "食品", "食品", "食品", "食品", "食品", "食品", "食品", "食品", "食品", "食品",
            "食品", "食品", "食品", "食品", "食品",
            # 家居
            "家居用品", "家居用品", "家居用品", "家居用品", "家居用品",
            "家居用品", "家居用品", "家居用品", "家居用品", "家居用品",
            "家居用品", "家居用品", "家居用品", "家居用品", "家居用品",
            # 服务
            "服务", "服务", "服务", "服务", "服务", "服务", "服务", "服务", "服务", "服务",
            "服务", "服务", "服务", "服务", "服务"
        ]
    }
    return pd.DataFrame(reviews_data)

def preprocess_text(text, remove_stopwords=True):
    """改进的文本预处理函数"""
    text = text.lower()
    text = re.sub(r'[^\w\s\u4e00-\u9fff]', '', text)
    text = ' '.join(text.split())

    if remove_stopwords:
        chinese_stopwords = {'的', '是', '在', '了', '和', '有', '我', '你', '他', '她', '它', '们',
                             '这', '那', '个', '一', '不', '也', '很', '都', '就', '要', '可以', '能',
                             '会', '对', '与', '及', '等', '让', '把', '被', '从', '向', '到', '为'}
        words = text.split()
        text = ' '.join([word for word in words if word not in chinese_stopwords])

    return text

def get_semantic_embedding(text, category_keywords):
    """强化的语义嵌入生成函数 - 确保明显聚类"""
    processed_text = preprocess_text(text)

    # 创建更强的类别向量基础
    embedding_dim = 300  # 降低维度以提高聚类效果
    base_vector = np.zeros(embedding_dim)

    # 为每个类别分配固定的向量区域
    category_centers = {
        '电子产品': np.array([10, 0, 0, 0, 0]),
        '服装': np.array([0, 10, 0, 0, 0]),
        '书籍': np.array([0, 0, 10, 0, 0]),
        '食品': np.array([0, 0, 0, 10, 0]),
        '家居用品': np.array([0, 0, 0, 0, 10]),
        '服务': np.array([5, 5, 0, 0, 0])
    }

    # 情感向量
    positive_center = np.array([0, 0, 0, 0, 0, 5])
    negative_center = np.array([0, 0, 0, 0, 0, -5])

    # 检测主要类别
    main_category = None
    max_keyword_match = 0

    for cat, keywords in category_keywords.items():
        keyword_match = sum(1 for kw in keywords if kw in processed_text)
        if keyword_match > max_keyword_match:
            max_keyword_match = keyword_match
            main_category = cat

    # 构建基础向量
    if main_category and main_category in category_centers:
        # 类别信号 - 前5维
        base_vector[:5] = category_centers[main_category]
        # 添加随机噪声但保持聚类
        base_vector[:5] += np.random.normal(0, 0.5, 5)

    # 情感信号 - 第6维
    positive_words = ['好', '优秀', '满意', '清晰', '快', '舒适', '精美', '实用', '方便', '推荐', '喜欢']
    negative_words = ['差', '坏', '慢', '模糊', '粗糙', '问题', '损坏', '掉色', '过时', '失望', '不满']

    pos_score = sum(1 for word in positive_words if word in processed_text)
    neg_score = sum(1 for word in negative_words if word in processed_text)

    if pos_score > neg_score:
        base_vector[5] = 5 + np.random.normal(0, 0.3)  # 正面情感
    elif neg_score > pos_score:
        base_vector[5] = -5 + np.random.normal(0, 0.3)  # 负面情感
    else:
        base_vector[5] = np.random.normal(0, 0.5)  # 中性

    # 填充剩余维度
    remaining_dims = embedding_dim - 6
    base_vector[6:] = np.random.normal(0, 0.1, remaining_dims)

    # 文本特定性 - 基于hash增加唯一性但保持聚类
    text_hash = hash(processed_text) % 1000
    base_vector[6:16] += np.sin(np.arange(10) * text_hash / 100) * 0.2

    return base_vector.tolist()

def get_embeddings_for_texts(texts, category_keywords):
    """为文本列表生成改进的嵌入"""
    embeddings = []
    print("正在生成语义嵌入...")
    for i, text in enumerate(texts):
        if i % 10 == 0:
            print(f"处理进度: {i}/{len(texts)}")
        embedding = get_semantic_embedding(text, category_keywords)
        embeddings.append(embedding)
    print("嵌入生成完成！")
    return embeddings

def plot_enhanced_tsne_visualization(embeddings, labels, title, sentiment_scores=None):
    """增强的t-SNE可视化"""
    print("正在进行t-SNE降维...")
    embeddings_array = np.array(embeddings)

    # 调整t-SNE参数以获得更好的聚类效果
    tsne = TSNE(
        n_components=2,
        random_state=42,
        perplexity=min(20, max(5, len(embeddings)//3)),  # 动态调整perplexity
        learning_rate=200,
        n_iter=1000,
        early_exaggeration=12
    )
    tsne_results = tsne.fit_transform(embeddings_array)

    # 创建更清晰的可视化
    plt.figure(figsize=(15, 10))

    # 为每个类别分配不同的颜色
    unique_labels = list(set(labels))
    colors = plt.cm.tab10(np.linspace(0, 1, len(unique_labels)))

    # 绘制散点图
    for i, label in enumerate(unique_labels):
        mask = [l == label for l in labels]
        x_coords = tsne_results[mask, 0]
        y_coords = tsne_results[mask, 1]

        # 根据情感评分调整点的形状
        if sentiment_scores is not None:
            scores = [sentiment_scores[j] for j, m in enumerate(mask) if m]
            # 高分用圆形，低分用三角形
            high_score_mask = np.array(scores) >= 4.0
            low_score_mask = np.array(scores) < 3.0
            mid_score_mask = (np.array(scores) >= 3.0) & (np.array(scores) < 4.0)

            if np.any(high_score_mask):
                plt.scatter(x_coords[high_score_mask], y_coords[high_score_mask],
                            c=[colors[i]], label=f'{label} (好评)',
                            s=80, alpha=0.8, marker='o', edgecolors='black', linewidth=0.5)
            if np.any(low_score_mask):
                plt.scatter(x_coords[low_score_mask], y_coords[low_score_mask],
                            c=[colors[i]], label=f'{label} (差评)',
                            s=80, alpha=0.8, marker='^', edgecolors='red', linewidth=1)
            if np.any(mid_score_mask):
                plt.scatter(x_coords[mid_score_mask], y_coords[mid_score_mask],
                            c=[colors[i]], label=f'{label} (中评)',
                            s=60, alpha=0.6, marker='s', edgecolors='gray', linewidth=0.5)
        else:
            plt.scatter(x_coords, y_coords, c=[colors[i]], label=label,
                        s=80, alpha=0.8, edgecolors='black', linewidth=0.5)

    plt.title(title, fontsize=18, fontweight='bold', pad=20)
    plt.xlabel('t-SNE 维度 1', fontsize=14)
    plt.ylabel('t-SNE 维度 2', fontsize=14)

    # 添加图例
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=10)

    # 添加网格
    plt.grid(True, alpha=0.3)

    plt.tight_layout()
    plt.show()
    print("t-SNE可视化完成！")

class EnhancedSemanticSearch:
    def __init__(self, texts, embeddings, categories, scores):
        self.texts = texts
        self.embeddings = np.array(embeddings)
        self.categories = categories
        self.scores = scores

    def search(self, query, top_k=5, category_filter=None, min_score=None):
        """增强的语义搜索"""
        # 生成查询嵌入
        category_keywords = {
            '电子产品': ['手机', '电脑', '耳机', '充电', '屏幕', '处理器', '摄像头', '内存', '电池'],
            '服装': ['衣服', '面料', '版型', '颜色', '做工', '裤子', '鞋子', '材质', '款式'],
            '书籍': ['书', '内容', '知识', '学习', '印刷', '装帧', '理论', '案例', '实用'],
            '食品': ['食品', '味道', '新鲜', '包装', '营养', '食材', '调味', '保质期'],
            '家居用品': ['家具', '设计', '实用', '材质', '组装', '收纳', '尺寸', '环保'],
            '服务': ['客服', '物流', '包装', '售后', '配送', '服务', '态度', '速度']
        }

        query_embedding = np.array(get_semantic_embedding(preprocess_text(query), category_keywords))

        # 计算余弦相似度
        similarities = cosine_similarity([query_embedding], self.embeddings)[0]

        # 应用过滤条件
        valid_indices = range(len(self.texts))
        if category_filter:
            valid_indices = [i for i in valid_indices if self.categories[i] == category_filter]
        if min_score:
            valid_indices = [i for i in valid_indices if self.scores[i] >= min_score]

        # 获取最相似的结果
        valid_similarities = [(i, similarities[i]) for i in valid_indices]
        valid_similarities.sort(key=lambda x: x[1], reverse=True)

        results = []
        for idx, sim in valid_similarities[:top_k]:
            results.append({
                'index': idx,
                'text': self.texts[idx],
                'category': self.categories[idx],
                'score': self.scores[idx],
                'similarity': sim
            })

        return results

    def display_search_results(self, query, results):
        """显示搜索结果"""
        print(f"\n查询: '{query}'")
        print("="*80)
        for i, result in enumerate(results, 1):
            print(f"{i}. 相似度: {result['similarity']:.4f} | "
                  f"类别: {result['category']} | 评分: {result['score']}")
            print(f"   文本: {result['text']}")
            print("-"*80)

def main():
    # 1. 加载增强的数据
    print("1. 加载增强的Amazon评论数据...")
    df = create_enhanced_sample_data()
    print(f"数据加载完成，共 {len(df)} 条评论")

    # 2. 数据预处理
    print("\n2. 数据预处理...")
    df['预处理文本'] = df['文本'].apply(preprocess_text)

    # 3. 定义类别关键词用于改进嵌入
    category_keywords = {
        '电子产品': ['手机', '电脑', '耳机', '充电', '屏幕', '处理器', '摄像头', '内存', '电池', '性能', '速度', '音质'],
        '服装': ['衣服', '面料', '版型', '颜色', '做工', '裤子', '鞋子', '材质', '款式', '舒适', '时尚', '质量'],
        '书籍': ['书', '内容', '知识', '学习', '印刷', '装帧', '理论', '案例', '实用', '作者', '文字', '纸张'],
        '食品': ['食品', '味道', '新鲜', '包装', '营养', '食材', '调味', '保质期', '口感', '健康', '美味'],
        '家居用品': ['家具', '设计', '实用', '材质', '组装', '收纳', '尺寸', '环保', '外观', '功能', '空间'],
        '服务': ['客服', '物流', '包装', '售后', '配送', '服务', '态度', '速度', '专业', '及时', '满意']
    }

    # 4. 生成改进的嵌入
    print("\n3. 生成改进的语义嵌入...")
    review_embeddings = get_embeddings_for_texts(df['预处理文本'].tolist(), category_keywords)

    # 5. 增强的t-SNE可视化
    print("\n4. 创建增强的评论t-SNE可视化...")
    plot_enhanced_tsne_visualization(
        review_embeddings,
        df['类别'].tolist(),
        "Amazon评论语义聚类可视化（按类别和评分）",
        df['评分'].tolist()
    )

    # 6. 词级嵌入可视化
    print("\n5. 创建词级语义嵌入可视化...")
    sample_words = ['手机', '电脑', '衣服', '鞋子', '书籍', '食品', '家具', '客服',
                    '质量', '价格', '服务', '速度', '舒适', '美味', '实用', '满意',
                    '好评', '差评', '推荐', '不推荐']
    word_embeddings = get_embeddings_for_texts(sample_words, category_keywords)

    plot_enhanced_tsne_visualization(
        word_embeddings,
        sample_words,
        "关键词语义空间可视化"
    )

    # 7. 增强的语义搜索演示
    print("\n6. 增强的语义搜索演示...")
    search_engine = EnhancedSemanticSearch(
        df['文本'].tolist(),
        review_embeddings,
        df['类别'].tolist(),
        df['评分'].tolist()
    )

    # 测试查询
    test_queries = [
        "电子产品质量好",
        "衣服穿着舒适",
        "书籍内容丰富",
        "服务态度差",
        "性价比高的产品"
    ]

    for query in test_queries:
        results = search_engine.search(query, top_k=3)
        search_engine.display_search_results(query, results)

    # 8. 数据分析可视化
    print("\n7. 创建数据分析可视化...")
    fig, axes = plt.subplots(2, 2, figsize=(15, 10))

    # 评分分布
    axes[0, 0].hist(df['评分'], bins=20, alpha=0.7, color='skyblue', edgecolor='black')
    axes[0, 0].set_title('评分分布', fontsize=14)
    axes[0, 0].set_xlabel('评分')
    axes[0, 0].set_ylabel('频次')

    # 类别分布
    category_counts = df['类别'].value_counts()
    axes[0, 1].pie(category_counts.values, labels=category_counts.index,
                   autopct='%1.1f%%', startangle=90)
    axes[0, 1].set_title('类别分布', fontsize=14)

    # 各类别平均评分
    avg_scores = df.groupby('类别')['评分'].mean().sort_values(ascending=True)
    axes[1, 0].barh(avg_scores.index, avg_scores.values, color='lightgreen', edgecolor='black')
    axes[1, 0].set_title('各类别平均评分', fontsize=14)
    axes[1, 0].set_xlabel('平均评分')

    # 评分vs类别散点图
    for i, category in enumerate(df['类别'].unique()):
        cat_data = df[df['类别'] == category]
        axes[1, 1].scatter([i] * len(cat_data), cat_data['评分'],
                           alpha=0.6, s=50, label=category)
    axes[1, 1].set_title('评分分布 by 类别', fontsize=14)
    axes[1, 1].set_xticks(range(len(df['类别'].unique())))
    axes[1, 1].set_xticklabels(df['类别'].unique(), rotation=45)
    axes[1, 1].set_ylabel('评分')
    axes[1, 1].legend(bbox_to_anchor=(1.05, 1), loc='upper left')

    plt.tight_layout()
    plt.show()

    print("\n所有演示完成！")
    print(f"数据统计:")
    print(f"- 总评论数: {len(df)}")
    print(f"- 类别数: {df['类别'].nunique()}")
    print(f"- 平均评分: {df['评分'].mean():.2f}")
    print(f"- 好评率 (≥4分): {(df['评分'] >= 4.0).mean()*100:.1f}%")

if __name__ == "__main__":
    main()